package com.kara.woodAgent.agent.wood.node;

import com.alibaba.fastjson2.JSON;
import com.kara.woodAgent.agent.graph.Next;
import com.kara.woodAgent.agent.graph.Node;
import com.kara.woodAgent.agent.model.ModelProvider;
import com.kara.woodAgent.agent.wood.context.WoodReactContext;
import com.kara.woodAgent.agent.wood.model.SpecialAgentResult;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.data.message.UserMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.request.ChatRequest;
import dev.langchain4j.model.chat.request.ResponseFormat;
import dev.langchain4j.model.chat.request.ResponseFormatType;
import dev.langchain4j.model.chat.response.ChatResponse;

import java.util.List;

/**
 * @author tzy
 * @version 1.0
 * @project wood_agent
 * @description
 * @date 2025/6/11 12:25:36
 */
public class SummaryNode implements Node<WoodReactContext> {

	private final ModelProvider modelProvider;

	private final String systemPrompt = """
                            #### 你的任务是
                            请你对照 你要总结的目标 对要总结内容进行总结，并且将总结信息按条输出。
                            #### 你要总结的目标是
                            {{plan}}
                            #### 你要总结的内容是
                            {{msg}}
                            #### 注意
                            你只负责总结，不负责做其他任何内容
                            #### 要求
                            1. 总结要满足任务的要求，保留关键信息，避免重复。
                            2. 并且为完成该任务的所有工具调用都要有简单解释并且留痕。
                            3. 总结信息要包含任务的最终执行结果。
                            4. 总结信息要符合任务的执行顺序，并且保留关键信息。
                            #### 输出格式
                            请用json格式输出，输出格式如下,包含三个字段：
                                - status: 状态，值为"success"或"fail",为任务执行的最终状态，成功为success,失败为fail (必要)
                                - message: 任务完成后退出的原因, 如果任务执行成功就是对任务执行的 总结信息, 如果执行失败的任务失败的原因  (必须)
                 """;


	public SummaryNode(ModelProvider modelProvider) {
		this.modelProvider = modelProvider;
	}
	@Override
	public Next execute(WoodReactContext context) {

		List<ChatMessage> chatMessages = context.getChatMessages();
		String plan = context.getPlan();
		String prompt = systemPrompt.replace("{{plan}}", plan).replace("{{msg}}",JSON.toJSONString(chatMessages));

		UserMessage userMessage = UserMessage.from(prompt);
		ChatLanguageModel chatModel = modelProvider.getChatModel("summary");


		ChatRequest request = ChatRequest.builder()
				.responseFormat(ResponseFormat.builder().type(ResponseFormatType.JSON).build())
				.messages(List.of(userMessage)).build();
		ChatResponse chatResponse = chatModel.chat(request);

		AiMessage aiMessage = chatResponse.aiMessage();

		SpecialAgentResult specialAgentResult = JSON.parseObject(aiMessage.text(), SpecialAgentResult.class);

		context.setSummary(specialAgentResult);
		return Next.End().step(aiMessage.text());
	}
}
